// 环境配置
// npm install typescript -g
// npm install ts-node -g

// ts中，冒号后面的都是类型

// 字符串
const str: string = 'hello'

// 数字
const num: number = 12

// 布尔值
const boolean: boolean = true


// 数组
const arr: number[] = [1, 2, 3]
const arr1: Array<number> = [1, 2, 3]

// 元组  元组类型允许表示一个 已知元素数量和类型的数组
const tuple: [string, number] = ['zf', 1]

let n: null = null
let u: undefined = undefined

// 枚举


// any
const arr3: any = ['sd', 1]

// unknown
// 定义了 unknown 类型的变量，可以赋值任意类型，但是不能调用它上面的方法和属性

let value1: any;
value1 = true;
value1 = 1;

value1.foo();
value1.length;
// 上面的都可以，而unknown不能调用它上面的属性和方法（在unknown没有被断言或细化到一个确切类型之前）

let value2: unknown;
value2 = false;
value2 = 3;

// value2.foo(); // Error


// TypeScript 3.0引入了一个顶级的unknown类型。 对照于any，unknown是类型安全的。
// 任何值都可以赋给unknown，但是当没有类型断言或基于控制流的类型细化时unknown不可以赋值给其它类型，除了它自己和any外。 
// 同样地，在unknown没有被断言或细化到一个确切类型之前，是不允许在其上进行任何操作的。

let element: (HTMLElement | null) = document.getElementById('root')
element.style.color = 'green'
// 如果 strictNullChecks 的值为true，上面的element需要非空断言
element!.style.color = 'green' // 非空断言，告诉ts：你放心，element肯定有值

// null 和 undefined 是其它类型的子类型
// 注意：如果tsconfig.json中的 strictNullChecks 的值为true，则不能把null和undefined赋值给x，需要这样写（let x: number|null|undefined）；
let x: number;
x = 1;
x = null; // 可以给number类型赋值null
x = undefined; // 可以给number类型赋值undefined


// never 代表永远不会出现的值
function error(message: string): never {
  throw new Error('报错了') // 这里直接异常结束了，不会走下面的代码
  console.log(1);
}

// void 代表一个函数没有返回值

// void 和 never 的区别
// void 可以被赋值给 undefined 和 null，但是 never 不能包含任何类型
// 返回类型为 void 的函数可以正常执行，但是返回类型为 never 的函数不能正常执行（比如： 死循环函数、异常终止函数）


// symbol

// BigInt

// const max = Number.MAX_SAFE_INTEGER
// console.log(max + 1 === max + 2); // true

const max = BigInt(Number.MAX_SAFE_INTEGER)
console.log(max + 1n === max + 2n); // false

// 在Js里，Number、BinInt 是内置类型，ts里是 number bigint 小写


// object类型  非原始数据类型
// Object.create(arr)
const create = (obj: object) => {

}
create({}) // 可以传入对象
create([]) // 可以传入数组
create(function(){}) // 可以传入方法

// 对象类型

export {}